import os.path
import random
import string
from PIL import Image,ImageFont,ImageDraw,ImageFilter


class IMGVerify:
    def __init__(self,x=140,y=40,length=4,size=40):
        """
        基本注释的初始方法
        :param x:
        :param y:
        :param length:
        :param size:
        """
        self.x=x
        self.y=y
        self.length = length
        self.size =size

    #generate random 生成随机字符
    def random_str(self):
        """
        暂定4个字符串 举例子数字和字母
        生成随机制定的字符串
        :return:
        """
        source = string.ascii_letters+string.digits
        result = ''.join(random.sample(source,self.length) )# 从以上source 中随机选取定长为length 的字符。
        # print(result)
        return result

    # 定义随机颜色
    def random_color(self,start=0,end=255):
        """
        生成rgb 数值
        RGB (100,20,30)
        :param start:   颜色开始数值
        :param end:     颜色最大值
        :return:
        """
        result =[random.randint(start,end) for i in range(3)]
        # for i in range(3):
        #      result.append(random.randint(start,end))
        # print(tuple(result))
        return tuple(result)


    #生成干扰线. 在画布上生成， 通过两点确定一条线
    def random_lines (self,draw):
        """

        :param draw:  画笔对象
        :return:  #不用返回 调用时 直接绘画
        """
        for i in range(self.length):
            line = [(random.randint(0,self.x),random.randint(0,self.y)) for i in range(2)]
            # 通过画笔对象钓友画线跳的的方法 fill 指定线条的颜色。
            draw.line(line,fill=self.random_color(40,200))

    def random_points(self,draw,rate):
        """

        :param draw:  画笔对象
        :param rate:  生成干扰点的平率 密集度
        :return:
        """
        for x in range(self.x):
            for y in range(self.y):
                    if random.randint(1,100) <= rate:
                        draw.point((x,y), fill = self.random_color(64,200))
        # points = random.randint()
# 组装验证码成图
    def verify_code(self,):
        '''

        :return:
        '''
        # 生成画布
        image=Image.new('RGB',(self.x,self.y),(255,255,255))
        # 创建font 对象 字体
        #
        path = os.path.abspath(__file__)
        file = os.path.dirname(path)
        font =ImageFont.truetype(f'{file}/PANG_CUSHU.ttf',self.size) #字体类型
        # 创建画笔对象， 准备在画笔上面画画。
        draw= ImageDraw.Draw(image) #
        self.random_points(draw,20)

        code = self.random_str()
#         验证码 应该写在画布的什么地方
        for i in range(self.length):
            # 写字 参数是  坐标，字符内容 字体 颜色
            draw.text((35*i+5,random.randint(3,6)),code[i],font=font, fill=self.random_color(32,178))
            # 高斯滤镜
            image.filter(ImageFilter.BLUR)
        return image, code





if __name__ == "__main__":
    img=IMGVerify()
    image,code =img.verify_code()
    with open('code.png','wb') as fp:
        image.save(fp)
    print(code)